package designpattern.factory;

import designpattern.proxy.impl.IntermediaryMethodInterceptor;
import net.sf.cglib.proxy.Enhancer;

/**
 * @author 吴阳基
 * @datetime 2024/1/6 10:05
 */
public class IntermediaryCglibProxyFactory {
    private static IntermediaryMethodInterceptor callback = new IntermediaryMethodInterceptor();

    /**
     * 工厂方法
     * @param clazz 被代理类的类加载器，这里是当前类的类加载器
     * @return 返回代理对象，这里返回的是一个代理类，而不是被代理类的实例，因为这个代理类是通�
     * @param <T> 被代理类的类型，这里是一个泛型，可以是任何类型，但是要求被代理类必须是一个�
     */
    public static <T> T create(Class<T> clazz) {
        Enhancer enhancer = new Enhancer();
        //为重写的方法指定回调调函数，这里是IntermediaryMethodInterceptor类的方法intercept()
        enhancer.setCallback(callback);
        //设置被代理类的类加载器，这里设置为当前类的类加载器
        enhancer.setSuperclass(clazz);
        //返回代理对象
        return (T) enhancer.create();
    }
}
